1
За пределами ловушки NULL
AI013Lesson 2
00:00

Переход от макросов стиля С к типобезопасным литералам в С++ представляет фундаментальный сдвиг в удобстве использования языка, устраняя «ловушку NULL» где двусмысленность нулевого макроса приводит к скрытым логическим ошибкам.

1. Ошибка разрешения перегрузки

В устаревших стандартах (С++98), NULL часто определяется как 0. При передаче в перегруженные функции компилятор интерпретирует NULL как целое число. Это подтверждается:

если (std::is_same<decltype(NULL), decltype(0)>::value)
std::cout << "NULL — это целое число";

2. Решение с помощью nullptr

С++11 представил nullptr, ключевое слово типа std::nullptr_t. В отличие от макроса, он не может быть неявно преобразован в целочисленный тип (кроме bool), что гарантирует выбор перегрузок, специфичных для указателей.

Устаревшая ловушкаfoo(NULL)Вызывает foo(int)Современное решениеfoo(nullptr)Вызывает foo(char*)

3. Связывание и взаимодействие

Современный С++ требует extern "C" чтобы избежать «искажения имён» при связывании с кодом на С (например, скомпилированным с помощью gcc). Сохранение типобезопасных указателей на этом уровне крайне важно.

$$\text{std::nullptr\_t} \neq \text{int}$$

main.py
TERMINALbash — 80x24
> Ready. Click "Run" to execute.
>